#pragma once

#include <string>
#include <iomanip>

enum class LogLevel {
    DEBUG,
    INFO,
    WARNING,
    ERROR,
    CRITICAL,
    FATAL
};


class Logging final {
public:
    virtual ~Logging() = default;

    virtual void log(const LogLevel &, const std::string &) const;

    virtual std::string get_time() const;

    virtual std::string log_level_colorful_string(const LogLevel &) const;

    virtual std::string log_level_normal_string(const LogLevel &) const;
};

#define LOG_INFO(message) Logging().log(LogLevel::INFO, message);
#define LOG_WARNING(message) Logging().log(LogLevel::WARNING, message);
#define LOG_ERROR(message) Logging().log(LogLevel::ERROR, message);
